#pragma once

#include "vec3.h"

namespace TG
{
	class vec3;

	class vec4
	{
	public:
		float x=0, y=0, z=0, w=1;

		vec4() :x(float(0)), y(float(0)), z(float(0)), w(float(0)) {}

		vec4(float t) :x(t), y(t), z(t), w(t) {}

		vec4(const vec4 &v) :x(v.x), y(v.y), z(v.z), w(v.w) {}

		vec4(float s1, float s2, float s3, float s4)
			:x(s1), y(s2), z(s3), w(s4)
		{}

		float& operator[](size_t i);

		const float& operator[](size_t i) const;

		vec4& operator=(const vec4 &v);

		vec4& operator=(const vec3 &v);

		template<typename U>
		vec4& operator+=(const U &s);

		vec4& operator+=(const vec4 &v);

		template<typename U>
		vec4& operator-=(const U &s);

		vec4& operator-=(const vec4 &v);

		template <typename U>
		vec4& operator*= (const U &s);

		vec4& operator*=(const vec4 &v);

		template <typename U>
		vec4& operator/=(const U &s);

		vec4& operator/=(const vec4 &v);

		vec4& operator++();

		vec4& operator--();

		vec4 operator+(const vec4 &v0);

		vec4 operator/(float s);

		vec4 operator*(float s);

		vec4 operator+(float s);

		operator vec3();
	};
}